//请求相关
import axios from "axios";
// 插入进度条组件:导入ngrogress
import NProgress from 'nprogress'
//导入ngrogress样式
import "nprogress/nprogress.css"
//导入接口地址
import { BASE_URL } from "@/config/conster";
import {displayBoxInfo} from "@/utils/msg"

axios.defaults.withCredentials = true;//允许跨域带cookie


//初始化一个axios对象
var instance = axios.create({
    baseURL: BASE_URL,
    timeout: 50000,
})

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    console.log(111)
    NProgress.start();
    console.log( localStorage.getItem("token"))
    const token = localStorage.getItem("token")
    if(token){
         config.headers.Authorization = `Bearer ${token}`
        console.log(config.headers.Authorization)
    }else{
        console.log("没有token")    
    }
    // 在发送请求之前做些什么
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
});

instance.interceptors.response.use(function (response) {
    NProgress.done();
    // 对响应数据做点什么
    const res = response.data;
    // 如果业务状态码不是成功状态，统一处理异常提示
    if (res.code !== undefined && res.code !== 1) {
        // displayBoxInfo(res.code, res.msg || '请求失败');
        // 如果是认证失败，可以清除token并跳转到登录页
        if (res.code === 401 || res.code === 403) {
            localStorage.removeItem('token');
            localStorage.removeItem('userInfo');
            // 可以根据需要添加路由跳转
            // router.push('/login');
        }
    }
    return response;
}, function (error) {
    NProgress.done();
    // 对请求错误做些什么
    let errorMessage = '网络请求失败';
    
    if (error.response) {
        // 服务器返回了错误状态码
        const status = error.response.status;
        const res = error.response.data;
        
        switch (status) {
            case 400:
                errorMessage = res?.msg || '请求参数错误';
                break;
            case 401:
                errorMessage = res?.msg || '未授权，请重新登录';
                localStorage.removeItem('token');
                localStorage.removeItem('userInfo');
                // router.push('/login');
                break;
            case 403:
                errorMessage = res?.msg || '拒绝访问';
                break;
            case 404:
                errorMessage = res?.msg || '请求的资源不存在';
                break;
            case 500:
                errorMessage = res?.msg || '服务器内部错误';
                break;
            case 502:
                errorMessage = '网关错误';
                break;
            case 503:
                errorMessage = '服务不可用';
                break;
            case 504:
                errorMessage = '网关超时';
                break;
            default:
                errorMessage = res?.msg || `请求失败 (${status})`;
        }
        
        // 如果有业务状态码，使用displayBoxInfo统一处理
        if (res?.code !== undefined) {
            displayBoxInfo(res.code, res.msg || errorMessage);
        } else {
            displayBoxInfo(-1, errorMessage);
        }
    } else if (error.request) {
        // 请求已发出，但没有收到响应
        errorMessage = '网络连接失败，请检查网络';
        displayBoxInfo(-1, errorMessage);
    } else {
        // 其他错误
        errorMessage = error.message || '请求配置错误';
        displayBoxInfo(-1, errorMessage);
    }
    
    return Promise.reject(error);
})




//定义一个get请求方法
export let $get = async (url, params) => {
    let {data}= await instance.get(url, params)
    // displayBoxInfo(data.code,data.msg)
    return data;
}

//定义一个post请求方法
export let $post = async (url, params) => {
    let {data} = await instance.post(url, params)
    // displayBoxInfo(data.code,data.msg)
    return data;
}

//定义一个delete请求方法
export let $del = async (url, params) => {
    let {data} = await instance.delete(url, params)
    // displayBoxInfo(data.code, data.msg)
    return data;
}

//定义一个put请求方法
export let $put = async (url, params) => {
    let {data} = await instance.put(url, params)
    // displayBoxInfo(data.code, data.msg)
    return data;
}